from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import random


class AuthCode(object):
    '''
    图片验证码类，
    :return (code, img_obj) === > (验证码，图片对象)
    '''
    def __init__(self,
                 size,
                 font_size,
                 mode= 'RGB',
                 font_url= 'static/font/111.ttf',
                 code_num= 5 ,
                 is_letter=True,
                 img_type= 'png',
                 x_offset= None,
                 y_offset= None):

        '''
        :param size: 图片大小，（'width', 'height'）
        :param font_size:  字体大小
        :param mode: 图片模式，默认'RGB'
        :param font_url: 字体url路径
        :param code_num: 验证码数量，默认5位验证码
        :param is_letter: 验证码是否包含字符，默认True
        :param img_type:  图片保存格式，默认png，可选的为GIF，JPEG，TIFF，PNG
        :param x_offset: 字符水平偏移量，即x坐标
        :param y_offset  字符垂直偏移量，即y坐标
                注意字符的(x，y)坐标不允许超出图片的(width,height)
        '''
        self.mode = mode
        self.size = size
        self.font_size = font_size
        self.font_url = font_url
        self.code_num = code_num
        self.is_letter = is_letter
        # self.img_type = img_type


    # 随机获取三基色
    def get_color(self):
        return random.randint(0,255), random.randint(0,255), random.randint(0,255)

    def __image(self):
        # 返回图片对象和画笔对象
        img_obj = Image.new(self.mode, self.size, self.get_color())
        img_draw = ImageDraw.Draw(img_obj)

        return img_draw, img_obj

    def __font(self):
        # 返回字体对象font_obj
        return ImageFont.truetype(self.font_url, self.font_size)

    def code_s(self):
        # 包含字符的验证码
        random_upper = chr(random.randint(65, 90))
        random_lower = chr(random.randint(97, 122))
        random_int = str(random.randint(0, 9))

        code_s = random.choice([random_upper, random_lower, random_int])
        return code_s

    def code(self):
        # 纯字符验证码[0-9]
        return str(random.randint(0, 9))

    def get_code(self):
        '''
        返回验证码和图片对象(画笔画好验证码的图片)
        '''
        code = ''
        img_draw, img_obj = self.__image()


        if self.is_letter:
            for n in range(self.code_num):
                tmp = self.code_s()

                '''
                （字符坐标，字符，字符颜色，字符字体）;
                此处坐标没有使用(x_offset, y_offset)，保留;
                一个个画，可以调整字符之间的间隙，全部验证码拿到后统一画，无法调整字符间隙
                '''
                img_draw.text((n * 50 + 50, 0), tmp,
                              self.get_color(), self.__font())
                code += tmp
        else:
            for n in range(self.code_num):
                tmp = self.code()

                '''
                （字符坐标，字符，字符颜色，字符字体）;
                此处坐标没有使用(x_offset, y_offset)，保留;
                一个个画，可以调整字符之间的间隙，全部验证码拿到后统一画，无法调整字符间隙
                '''
                img_draw.text((n * 50 + 50, 0), tmp,
                              self.get_color(), self.__font())
                code += tmp

        return code, img_obj







